package br.com.virtual.base.controller.cadastro;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import br.com.virtual.base.enums.ActionFormEnum;
import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.cadastrar.model.Categoria;
import br.com.virtual.cadastrar.service.CategoriaService;

@ManagedBean
@ViewScoped
public class CategoriaMB implements Serializable {

	private static final long serialVersionUID = 1L;
	private Categoria categoria;
	private List<Categoria> categorias;
	private List<Categoria> categoriasToCombo;
	private List<Categoria> categoriasAtivas;

	private ActionFormEnum stateForm = ActionFormEnum.CREATE;

	@EJB
	private CategoriaService categoriaService;

	public CategoriaMB() {

	}

	public CategoriaService getCategoriaService() {
		return categoriaService;
	}

	public void setCategoriaService(CategoriaService categoriaService) {
		this.categoriaService = categoriaService;
	}

	@PostConstruct
	private void init() {

		this.novo();
	}

	public void novo() {
		categoria = new Categoria();
		categorias = null;
		stateForm = ActionFormEnum.CREATE;
	}

	public void save() {

		try {

			if (stateForm.equals(ActionFormEnum.CREATE))
				categoriaService.create(categoria);
			else if (stateForm.equals(ActionFormEnum.UPDATE))
				categoriaService.update(categoria);

			generateFacesMessage("Operação realizada com sucesso.",
					FacesMessage.SEVERITY_INFO);

		} catch (VirtualValidationException e) {

			for (String s : e.getErros()) {
				generateFacesMessage(s, FacesMessage.SEVERITY_ERROR);
			}

		}

		init();
	}

	public void edit() {
		stateForm = ActionFormEnum.UPDATE;
	}

	public String delete(ActionEvent evento) {

		try {
			categoriaService.delete(categoria);
			generateFacesMessage("Item excluido com sucesso.",
					FacesMessage.SEVERITY_INFO);

		} catch (VirtualValidationException e) {

			for (String s : e.getErros()) {
				generateFacesMessage(s, FacesMessage.SEVERITY_ERROR);
			}

		}
		init();
		return "";
	}

	private void generateFacesMessage(String message,
			FacesMessage.Severity severity) {

		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severity, message, ""));
	}

	/*
	 * GETTERS AND SETTERS
	 */
	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public List<Categoria> getCategorias() {
		if (categorias == null) {
			categorias = categoriaService.getList();
//			Collections.sort(categorias);
		}

		return categorias;
	}

	public void setCategorias(List<Categoria> listCat) {
		this.categorias = listCat;
	}

	public List<Categoria> getCategoriasAtivas() {

		if (categoriasAtivas == null) {
			categoriasAtivas = categoriaService.getListAtivo();
			Collections.sort(categoriasAtivas);
		}
		return categoriasAtivas;
	}

	public void setCategoriasAtivas(List<Categoria> categoriasAtivas) {
		this.categoriasAtivas = categoriasAtivas;
	}

	public ActionFormEnum getStateForm() {
		return stateForm;
	}

	public void setStateForm(ActionFormEnum stateForm) {
		this.stateForm = stateForm;
	}

	public List<Categoria> getCategoriasToCombo() {

		categoriasToCombo = categoriaService.getListSemPai();
		return categoriasToCombo;
	}

	public void setCategoriasToCombo(List<Categoria> categoriasToCombo) {
		this.categoriasToCombo = categoriasToCombo;
	}

}
